package com.ruoyi.collect.task;

import com.ruoyi.collect.domain.CollectSite;
import com.ruoyi.collect.domain.CollectTask;
import com.ruoyi.collect.service.ICollectEngineService;
import com.ruoyi.collect.service.ICollectSiteService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.util.List;

/**
 * 采集定时任务
 *
 * @author ruoyi
 * @date 2025-11-07
 */
@Component
public class CollectScheduledTask {

    private static final Logger log = LoggerFactory.getLogger(CollectScheduledTask.class);

    @Autowired
    private ICollectSiteService collectSiteService;

    @Autowired
    private ICollectEngineService collectEngineService;

    /**
     * 自动采集任务
     * 每小时执行一次，检查需要自动采集的站点
     */
    @Scheduled(cron = "0 0 * * * ?")
    public void autoCollectTask() {
        log.info("开始执行自动采集任务...");

        try {
            // 查询开启自动采集的站点
            CollectSite query = new CollectSite();
            query.setAutoCollect("1");
            query.setStatus("0");
            List<CollectSite> siteList = collectSiteService.selectCollectSiteList(query);

            if (siteList == null || siteList.isEmpty()) {
                log.info("没有需要自动采集的站点");
                return;
            }

            log.info("找到 {} 个需要自动采集的站点", siteList.size());

            for (CollectSite site : siteList) {
                try {
                    // 检查是否到达采集间隔
                    if (shouldCollect(site)) {
                        log.info("开始自动采集站点: {}", site.getSiteName());

                        // 创建采集任务
                        Integer hours = site.getCollectHours() != null ? site.getCollectHours() : 24;
                        CollectTask task = collectEngineService.collectRecent(site.getSiteId(), hours);

                        if (task != null) {
                            log.info("站点 {} 自动采集任务创建成功，任务ID: {}", site.getSiteName(), task.getTaskId());
                        }
                    }
                } catch (Exception e) {
                    log.error("站点 {} 自动采集失败: {}", site.getSiteName(), e.getMessage(), e);
                }
            }

            log.info("自动采集任务执行完成");

        } catch (Exception e) {
            log.error("自动采集任务执行异常: {}", e.getMessage(), e);
        }
    }

    /**
     * 判断是否应该执行采集
     *
     * @param site 站点信息
     * @return 是否应该采集
     */
    private boolean shouldCollect(CollectSite site) {
        if (site.getLastCollectTime() == null) {
            return true;
        }

        // 计算距离上次采集的时间（秒）
        long lastCollectTime = site.getLastCollectTime().getTime();
        long currentTime = System.currentTimeMillis();
        long elapsedSeconds = (currentTime - lastCollectTime) / 1000;

        // 获取采集间隔（秒）
        Integer collectInterval = site.getCollectInterval();
        if (collectInterval == null) {
            collectInterval = 3600; // 默认1小时
        }

        return elapsedSeconds >= collectInterval;
    }

    /**
     * 清理过期任务
     * 每天凌晨2点执行，清理30天前的已完成任务
     */
    @Scheduled(cron = "0 0 2 * * ?")
    public void cleanExpiredTasks() {
        log.info("开始清理过期采集任务...");
        // TODO: 实现清理逻辑
        log.info("过期采集任务清理完成");
    }

    /**
     * 任务状态同步
     * 每5分钟执行一次，同步长时间未更新的任务状态
     */
    @Scheduled(cron = "0 */5 * * * ?")
    public void syncTaskStatus() {
        // TODO: 实现状态同步逻辑
        // 检查执行中但长时间无更新的任务，标记为异常
    }
}